package qjc.g_链表;

import com.链表.练习题.ListNode;

public class g7_两数相加 {
    /**
     * 创建一个虚拟头节点，方便操作，初始化指针 cur，指向虚拟头节点，
     * 初始化进位值，遍历两个链表，直到两个链表都为空，获取当前节点的值，如果节点为空则取0，
     * 计算当前位的和，更新进位值，创建新节点，存储当前位的值，移动指针，
     * 移动链表指针，如果最后还有进位，创建新节点，返回结果链表（虚拟头节点的下一个节点）
     */
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode pre = new ListNode(0);
        ListNode cur = pre;
        int carry = 0;
        while (l1 != null || l2 != null){
            int x1 = l1 == null ? 0 : l1.val;
            int x2 = l2 == null ? 0 : l2.val;
            int sum = x1 + x2 + carry;
            carry = sum / 10;
            cur.next = new ListNode(sum % 10);
            cur = cur.next;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        if(carry == 1){
            cur.next = new ListNode(1);
        }
        return pre.next;
    }
}
